Introduction

The aim of this pretest for the CL-Experiment (CO2 long-term periodic injection experiment) was to find out how the temperature of two synthetic resins behave over time in a borehole.

Material & Methods

Experimental Setup

For this resin pretest, double-walled cylinders (r1 = 2.15 cm, r2 = 2.5 cm, 17 cm high, 325.5 g) made of poly-amide were used and bedded on sand. The two resins and their corresponding hardener (Sikadur-52 and Biresin CR83 & CH83-10) were mixed at a ambient temperature of 10 °C. The resins poured from a height of 2.5 m through a plastic tube (diameter 1 cm) once in both annuli (1 L + 0.25 L) and once in the outer annulus (1 L) into the prepared forms (Figure 1). The temperature was measured with TMP35 sensors (Analog Devices, USA) attached to temperature-resistant silicone cable (wire size 0.25 mm2, Helukabel, Switzerland) (Figure 2). When both annuli have been filled, the temperature sensors were placed inside and outside respectively at a height of 9 cm. If only the outer annulus was filled, the temperature sensors were placed at a height of 6 (lower third) and 12 cm (higher third) respectively. The data logging was done every 6 seconds with a WioTerminal (Seeed Technology, China). The data logging and processing code was written with Arduino IDE (version 2.1.0). The data analysis was done with R (version 4.2.2) and RStudio (version 2023.03.0+386).

Figure 1: a) Overview of the experimental setup and b) close-up of resin filling.

Figure 2: Double-walled poly-amide cylinders (r1 = 2.15 cm, r2 = 2.5 cm, 17 cm high, 325.5 g) filled with Sikadur-52 resin in both annuli. TMP35 sensor No. 1 in the outer annulus and TMP35 sensor No. 3 in the inner annulus.

Loading Libraries and Import Data-Set

The data were imported as txt. files. The sensor numbers were then converted to a factor (as.factor(), package “base”) and the time was transformed to a date-time format (dmy_hms(), package “lubridate”). The time since the start of the experiment was also added (difftime(), package “base”). The packages “ggplot2”, “ggpmisc” and “ggprism” were used to create the diagrams.

library(lubridate)
library(dplyr)
library(ggplot2)
library(ggpmisc)
library(ggprism)

Sikadur_raw <- read.csv("Experiment1_Sikadur.txt", sep = ";", header = T, col.names = c("Time","Sensor_No","Analog_Read","Voltage_mV","Temperature_degC"))

Sikadur_both_annulus <- Sikadur_raw %>%
  mutate(Sensor_No = as.factor(Sensor_No)) %>%
  mutate(Time = dmy_hms(Time)) %>%
  mutate(Time_since_Start = difftime(time1 = Time, time2 = min(Time), units = "hours")) %>%
  filter(Sensor_No == 1 | Sensor_No == 3)

Sikadur_outer_annulus <- Sikadur_raw %>%
  mutate(Sensor_No = as.factor(Sensor_No)) %>%
  mutate(Time = dmy_hms(Time)) %>%
  filter(Time >= "2023-06-07 15:00:00") %>%
  mutate(Time_since_Start = difftime(time1 = Time, time2 = min(Time), units = "hours")) %>%
  filter(Sensor_No == 2 | Sensor_No == 4)



Biresin_raw <- read.csv("Experiment2_Biresin.txt", sep = ";", header = T, col.names = c("Time","Sensor_No","Analog_Read","Voltage_mV","Temperature_degC"))

Biresin_both_annulus <- Biresin_raw %>%
  mutate(Sensor_No = as.factor(Sensor_No)) %>%
  mutate(Time = dmy_hms(Time)) %>%
  mutate(Time_since_Start = difftime(time1 = Time, time2 = min(Time), units = "hours")) %>%
  filter(Sensor_No == 1 | Sensor_No == 3)

Biresin_outer_annulus <- Biresin_raw %>%
  mutate(Sensor_No = as.factor(Sensor_No)) %>%
  mutate(Time = dmy_hms(Time)) %>%
  filter(Time >= "2023-06-07 15:00:00") %>%
  mutate(Time_since_Start = difftime(time1 = Time, time2 = min(Time), units = "hours")) %>%
  filter(Sensor_No == 2 | Sensor_No == 4)

Results

Sikadur

When both annuli have been filled, the temperature reached its maximum after one hour and was at 142°C (inner annulus) and 134°C (outer annulus) respectively (Figure 3). To fill the cylinder completely with the resin, 13 minutes were needed. The viscosity of the Sikadur slowly increased after 15 minutes and became solid after 1 hours. From this moment on, there was minimal smoke development for about 4 minutes. Some stress cracks formed (Figure 4). The volume of initially 1.25 L decreased by 20 mL (-1.6 %). The axial diameter remained unchanged at r1 = 2.15 cm cm and r1 = 2.5 cm respectively.

Sikadur_both_annulus_Plot <- ggplot(data = Sikadur_both_annulus, mapping = aes(x = Time_since_Start, y = Temperature_degC, colour = Sensor_No)) +
  geom_line(linewidth = 1.25) +
  theme_classic() +
  theme(axis.title.y = element_text(margin = margin(r = 15)), 
        axis.title.x = element_text(margin = margin(t = 10)), 
        axis.text= element_text(colour="black")) +
  xlab("Time [h]") +
  ylab(expression("Temperature [°C]")) +
  scale_x_continuous(guide = "prism_minor", 
                             limits = c(0, 16),
                             expand = c(0, 0),
                             minor_breaks = seq(0, 16, 2)) +
  scale_y_continuous(limits = c(0,160), breaks = seq(0, 160, 10), expand = c(0,0)) +
  labs(caption = "Jonas M. Windisch, Mont Terri Rock Lab, swisstopo") +
  theme(legend.position = c(0.9, 0.5)) +
  guides(color = guide_legend(title = "Temperatur Sensors")) +
  scale_color_manual(labels = c("No. 1 (outer annulus)", "No. 3 (inner annulus)"),
                     values = c("darkolivegreen3","royalblue1")) +
  ggtitle("Sikadur-52 (both annulus filled)") +
  stat_peaks(span = NULL,
             geom = "text_s",
             mapping = aes(label = paste(after_stat(y.label), after_stat(x.label))),
             x.label.fmt = "after %.0f hrs ",
             y.label.fmt = " Max Temp. of %.0f°C",
             arrow = grid::arrow(length = unit(0.3, "cm")),
             position = position_nudge_keep(x = c(0.5, 0.25),  y = c(5, 10)),
             hjust = 0)
  
Sikadur_both_annulus_Plot

ggsave(filename = "Sikadur_both_annulus.pdf", plot = Sikadur_both_annulus_Plot, width = 25, height = 10, units = "cm", dpi = 1100)

Sikadur_both_annulus_Plot_transparent <- Sikadur_both_annulus_Plot + theme(legend.background = element_rect(fill = "transparent"),
        legend.box.background = element_rect(fill = "transparent"),
        panel.background = element_rect(fill = "transparent"),
        plot.background = element_rect(fill = "transparent",
                                       color = NA))
ggsave(Sikadur_both_annulus_Plot_transparent, filename = "Sikadur_both_annulus_transparent.png", bg = "transparent")

Figure 3: Temperature curve of the Sikadur-52 resin (both annuli filled) measured every 6 seconds over 16 hours.

Figure 4: Close-up image of stress cracks in Sikadur-52 resin (both annuli filled).


If only the inner annulus has been filled, the temperature reached its maximum after one hour and was at 130°C (lower third) and 114°C (higher third) respectively (Figure 5). To fill the cylinder completely with the resin, 11 minutes were needed. The viscosity of the Sikadur slowly increased after 15 hours and became solid after 1 hours. From this moment on, there was minimal smoke development for about 3 minutes. Some stress cracks formed. The volume of initially 0.8 L decreased by 20 mL (-2.5 %). The axial diameter remained unchanged.

Sikadur_outer_annulus_Plot <- ggplot(data = Sikadur_outer_annulus, mapping = aes(x = Time_since_Start, y = Temperature_degC, colour = Sensor_No)) +
  geom_line(linewidth = 1.25) +
  theme_classic() +
  theme(axis.title.y = element_text(margin = margin(r = 15)), 
        axis.title.x = element_text(margin = margin(t = 10)), 
        axis.text= element_text(colour="black")) +
  xlab("Time [h]") +
  ylab(expression("Temperature [°C]")) +
  scale_x_continuous(guide = "prism_minor", 
                             limits = c(0, 16),
                             expand = c(0, 0),
                             minor_breaks = seq(0, 16, 2)) +
  scale_y_continuous(limits = c(0,160), breaks = seq(0, 160, 10), expand = c(0,0)) +
  labs(caption = "Jonas M. Windisch, Mont Terri Rock Lab, swisstopo") +
  theme(legend.position = c(0.9, 0.5)) +
  guides(color = guide_legend(title = "Temperatur Sensors")) +
  scale_color_manual(labels = c("No. 2 (lower third)", "No. 4 (upper third)"),
                     values = c("darkolivegreen3","royalblue1")) +
  ggtitle("Sikadur-52 (outer annulus filled)") +
  stat_peaks(span = NULL,
             geom = "text_s",
             mapping = aes(label = paste(after_stat(y.label), after_stat(x.label))),
             x.label.fmt = "after %.0f hrs ",
             y.label.fmt = " Max Temp. of %.0f°C",
             arrow = grid::arrow(length = unit(0.3, "cm")),
             position = position_nudge_keep(x = c(0.5, 0.25),  y = c(5, 10)),
             hjust = 0)
  
Sikadur_outer_annulus_Plot

ggsave(filename = "Sikadur_outer_annulus.pdf", plot = Sikadur_outer_annulus_Plot, width = 25, height = 10, units = "cm", dpi = 1100)

Sikadur_outer_annulus_Plot_transparent <- Sikadur_outer_annulus_Plot + theme(legend.background = element_rect(fill = "transparent"),
        legend.box.background = element_rect(fill = "transparent"),
        panel.background = element_rect(fill = "transparent"),
        plot.background = element_rect(fill = "transparent",
                                       color = NA))
ggsave(Sikadur_outer_annulus_Plot_transparent, filename = "Sikadur_outer_annulus_transparent.png", bg = "transparent")
Figure 5: Temperature curve of the Sikadur-52 resin (outer annulus filled) measured every 6 seconds over 16 hours.

Biresin

When both annuli have been filled, the temperature reached its maximum after 8 to 9 hours and was at 145°C (inner annulus) and 144°C (outer annulus) respectively (Figure 6). To fill the cylinder completely with the resin, 7 minutes were needed. The viscosity of the Biresin slowly increased after 6 hours and became solid after 8 hours. From this moment on, there was minimal smoke development for about 3 minutes. Some stress cracks formed (Figure 7). The volume of initially 1.25 L decreased by 50 mL (-4 %). The axial diameter remained unchanged.

Biresin_both_annulus_Plot <- ggplot(data = Biresin_both_annulus, mapping = aes(x = Time_since_Start, y = Temperature_degC, colour = Sensor_No)) +
  geom_line(linewidth = 1.25) +
  theme_classic() +
  theme(axis.title.y = element_text(margin = margin(r = 15)), 
        axis.title.x = element_text(margin = margin(t = 10)), 
        axis.text= element_text(colour="black")) +
  xlab("Time [h]") +
  ylab(expression("Temperature [°C]")) +
  scale_x_continuous(guide = "prism_minor", 
                             limits = c(0, 16),
                             expand = c(0, 0),
                             minor_breaks = seq(0, 16, 2)) +
  scale_y_continuous(limits = c(0,160), breaks = seq(0, 160, 10), expand = c(0,0)) +
  labs(caption = "Jonas M. Windisch, Mont Terri Rock Lab, swisstopo") +
  theme(legend.position = c(0.25, 0.5)) +
  guides(color = guide_legend(title = "Temperatur Sensors")) +
  scale_color_manual(labels = c("No. 1 (outer annulus)", "No. 3 (inner annulus)"),
                     values = c("darkolivegreen3","royalblue1")) +
  ggtitle("Biresin CR83 & CH83-10 (both annulus filled)") +
  stat_peaks(span = NULL,
             geom = "text_s",
             mapping = aes(label = paste(after_stat(y.label), after_stat(x.label))),
             x.label.fmt = "after %.0f hrs ",
             y.label.fmt = " Max Temp. of %.0f°C",
             arrow = grid::arrow(length = unit(0.3, "cm")),
             position = position_nudge_center(x = c(-0.5, -0.25),  y = c(-4, 6)),
             hjust = 1)
  
Biresin_both_annulus_Plot

ggsave(filename = "Biresin_both_annulus.pdf", plot = Biresin_both_annulus_Plot, width = 25, height = 10, units = "cm", dpi = 1100)

Biresin_both_annulus_Plot_transparent <- Biresin_both_annulus_Plot + theme(legend.background = element_rect(fill = "transparent"),
        legend.box.background = element_rect(fill = "transparent"),
        panel.background = element_rect(fill = "transparent"),
        plot.background = element_rect(fill = "transparent",
                                       color = NA))
ggsave(Biresin_both_annulus_Plot_transparent, filename = "Biresin_both_annulus_transparent.png", bg = "transparent")

Figure 6: Temperature curve of the Biresin CR83 & CH83-10 resin (both annuli filled) measured every 6 seconds over 16 hours.

Figure 7: Close-up image of stress cracks in Biresin CR83 & CH83-10 resin (both annuli filled).


If only the inner annulus has been filled, the temperature reached its maximum after 11 hours and was at 113°C (lower third) and 91°C (higher third) respectively (Figure 8). To fill the cylinder completely with the resin, 4 minutes were needed. The viscosity of the Biresin slowly increased after 6 hours and became solid after 8 hours. From this moment on, there was minimal smoke development for about 2 minutes. Some stress cracks formed. The volume of initially 1 L decreased by 60 mL (-6 %). The axial diameter remained unchanged.

Biresin_outer_annulus_Plot <- ggplot(data = Biresin_outer_annulus, mapping = aes(x = Time_since_Start, y = Temperature_degC, colour = Sensor_No)) +
  geom_line(linewidth = 1.25) +
  theme_classic() +
  theme(axis.title.y = element_text(margin = margin(r = 15)), 
        axis.title.x = element_text(margin = margin(t = 10)), 
        axis.text= element_text(colour="black")) +
  xlab("Time [h]") +
  ylab(expression("Temperature [°C]")) +
  scale_x_continuous(guide = "prism_minor", 
                             limits = c(0, 16),
                             expand = c(0, 0),
                             minor_breaks = seq(0, 16, 2)) +
  scale_y_continuous(limits = c(0,160), breaks = seq(0, 160, 10), expand = c(0,0)) +
  labs(caption = "Jonas M. Windisch, Mont Terri Rock Lab, swisstopo") +
  theme(legend.position = c(0.25, 0.5)) +
  guides(color = guide_legend(title = "Temperatur Sensors")) +
  scale_color_manual(labels = c("No. 2 (lower third)", "No. 4 (upper third)"),
                     values = c("darkolivegreen3","royalblue1")) +
  ggtitle("Biresin CR83 & CH83-10 (outer annulus filled)") +
  stat_peaks(span = NULL,
             geom = "text_s",
             mapping = aes(label = paste(after_stat(y.label), after_stat(x.label))),
             x.label.fmt = "after %.0f hrs ",
             y.label.fmt = " Max Temp. of %.0f°C",
             arrow = grid::arrow(length = unit(0.3, "cm")),
             position = position_nudge_keep(x = c(-0.5, -0.25),  y = c(5, 10)),
             hjust = 1)
  
Biresin_outer_annulus_Plot

ggsave(filename = "Biresin_outer_annulus.pdf", plot = Biresin_outer_annulus_Plot, width = 25, height = 10, units = "cm", dpi = 1100)

Biresin_outer_annulus_Plot_transparent <- Biresin_outer_annulus_Plot + theme(legend.background = element_rect(fill = "transparent"),
        legend.box.background = element_rect(fill = "transparent"),
        panel.background = element_rect(fill = "transparent"),
        plot.background = element_rect(fill = "transparent",
                                       color = NA))
ggsave(Biresin_outer_annulus_Plot_transparent, filename = "Biresin_outer_annulus_transparent.png", bg = "transparent")
Figure 8: Temperature curve of the Biresin CR83 & CH83-10 resin (outer annulus filled) measured every 6 seconds over 16 hours.
LS0tCnRpdGxlOiAiUmVzaW4gUHJlLVRlc3QiCmF1dGhvcjogIkpvbmFzIE0uIFdpbmRpc2NoLCBzd2lzc3RvcG8iCmRhdGU6ICIxNi4wNi4yMDIzIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRoZW1lOiBqb3VybmFsCiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICAgIGNvZGVfZG93bmxvYWQ6IHllcwogICAgb3V0cHV0X2RpcjogZG9jcwogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKLS0tCgpgYGB7PWh0bWx9CjxzdHlsZT4KYm9keSB7CnRleHQtYWxpZ246IGp1c3RpZnk7Zm9udC1zaXplOiAxN3NweDsgbGluZS1oZWlnaHQ6IDEuNzVlbX0KICB9Cjwvc3R5bGU+CmBgYApgYGB7PWh0bWx9CjxzdHlsZT4KI1RPQyB7CiAgYmFja2dyb3VuZDogdXJsKCJodHRwczovL3d3dy5xdWludGVzc2Eub3JnL3BpY3R1cmVzL25ld3NfMzg4LmpwZyIpOwogIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjsKICBwYWRkaW5nLXRvcDogMjUwcHggIWltcG9ydGFudDsKICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Owp9Cjwvc3R5bGU+CmBgYAojIyBJbnRyb2R1Y3Rpb24KClRoZSBhaW0gb2YgdGhpcyBwcmV0ZXN0IGZvciB0aGUgQ0wtRXhwZXJpbWVudCAoQ09+Mn4gbG9uZy10ZXJtIHBlcmlvZGljIGluamVjdGlvbiBleHBlcmltZW50KSB3YXMgdG8gZmluZCBvdXQgaG93IHRoZSB0ZW1wZXJhdHVyZSBvZiB0d28gc3ludGhldGljIHJlc2lucyBiZWhhdmUgb3ZlciB0aW1lIGluIGEgYm9yZWhvbGUuCgojIyBNYXRlcmlhbCAmIE1ldGhvZHMKCiMjIyBFeHBlcmltZW50YWwgU2V0dXAKCkZvciB0aGlzIHJlc2luIHByZXRlc3QsIGRvdWJsZS13YWxsZWQgY3lsaW5kZXJzIChyfjF+ID0gMi4xNSBjbSwgcn4yfiA9IDIuNSBjbSwgMTcgY20gaGlnaCwgMzI1LjUgZykgbWFkZSBvZiBwb2x5LWFtaWRlIHdlcmUgdXNlZCBhbmQgYmVkZGVkIG9uIHNhbmQuIFRoZSB0d28gcmVzaW5zIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIGhhcmRlbmVyIChTaWthZHVyLTUyIGFuZCBCaXJlc2luIENSODMgJiBDSDgzLTEwKSB3ZXJlIG1peGVkIGF0IGEgYW1iaWVudCB0ZW1wZXJhdHVyZSBvZiAxMCDCsEMuIFRoZSByZXNpbnMgcG91cmVkIGZyb20gYSBoZWlnaHQgb2YgMi41IG0gdGhyb3VnaCBhIHBsYXN0aWMgdHViZSAoZGlhbWV0ZXIgMSBjbSkgb25jZSBpbiBib3RoIGFubnVsaSAoMSBMICsgMC4yNSBMKSBhbmQgb25jZSBpbiB0aGUgb3V0ZXIgYW5udWx1cyAoMSBMKSBpbnRvIHRoZSBwcmVwYXJlZCBmb3JtcyAoRmlndXJlIDEpLiBUaGUgdGVtcGVyYXR1cmUgd2FzIG1lYXN1cmVkIHdpdGggVE1QMzUgc2Vuc29ycyAoQW5hbG9nIERldmljZXMsIFVTQSkgYXR0YWNoZWQgdG8gdGVtcGVyYXR1cmUtcmVzaXN0YW50IHNpbGljb25lIGNhYmxlICh3aXJlIHNpemUgMC4yNSBtbV4yXiwgSGVsdWthYmVsLCBTd2l0emVybGFuZCkgKEZpZ3VyZSAyKS4gV2hlbiBib3RoIGFubnVsaSBoYXZlIGJlZW4gZmlsbGVkLCB0aGUgdGVtcGVyYXR1cmUgc2Vuc29ycyB3ZXJlIHBsYWNlZCBpbnNpZGUgYW5kIG91dHNpZGUgcmVzcGVjdGl2ZWx5IGF0IGEgaGVpZ2h0IG9mIDkgY20uIElmIG9ubHkgdGhlIG91dGVyIGFubnVsdXMgd2FzIGZpbGxlZCwgdGhlIHRlbXBlcmF0dXJlIHNlbnNvcnMgd2VyZSBwbGFjZWQgYXQgYSBoZWlnaHQgb2YgNiAobG93ZXIgdGhpcmQpIGFuZCAxMiBjbSAoaGlnaGVyIHRoaXJkKSByZXNwZWN0aXZlbHkuIFRoZSBkYXRhIGxvZ2dpbmcgd2FzIGRvbmUgZXZlcnkgNiBzZWNvbmRzIHdpdGggYSBXaW9UZXJtaW5hbCAoU2VlZWQgVGVjaG5vbG9neSwgQ2hpbmEpLiBUaGUgZGF0YSBsb2dnaW5nIGFuZCBwcm9jZXNzaW5nIGNvZGUgd2FzIHdyaXR0ZW4gd2l0aCBBcmR1aW5vIElERSAodmVyc2lvbiAyLjEuMCkuIFRoZSBkYXRhIGFuYWx5c2lzIHdhcyBkb25lIHdpdGggUiAodmVyc2lvbiA0LjIuMikgYW5kIFJTdHVkaW8gKHZlcnNpb24gMjAyMy4wMy4wKzM4NikuCgo8Y2VudGVyPgoKIVtdKEltYWdlcy9PdmVydmlld19MYWJlbC5wbmcpe3dpZHRoPSIzMDAifSAhW10oSW1hZ2VzL0Nsb3NldXBfMV9MYWJlbC5wbmcpe3dpZHRoPSIzMDAifQoKPGZvbnQgc2l6ZSA9ICIyIj4gKipGaWd1cmUgMToqKiAqKmEpKiogT3ZlcnZpZXcgb2YgdGhlIGV4cGVyaW1lbnRhbCBzZXR1cCBhbmQgKipiKSoqIGNsb3NlLXVwIG9mIHJlc2luIGZpbGxpbmcuIDwvZm9udD4KCiFbXShJbWFnZXMvQ2xvc2V1cF8yX0xhYmVsLnBuZyl7d2lkdGg9IjMwMCJ9Cgo8Zm9udCBzaXplID0gIjIiPiAqKkZpZ3VyZSAyOioqIERvdWJsZS13YWxsZWQgcG9seS1hbWlkZSBjeWxpbmRlcnMgKHJ+MX4gPSAyLjE1IGNtLCByfjJ+ID0gMi41IGNtLCAxNyBjbSBoaWdoLCAzMjUuNSBnKSBmaWxsZWQgd2l0aCBTaWthZHVyLTUyIHJlc2luIGluIGJvdGggYW5udWxpLiBUTVAzNSBzZW5zb3IgTm8uIDEgaW4gdGhlIG91dGVyIGFubnVsdXMgYW5kIFRNUDM1IHNlbnNvciBOby4gMyBpbiB0aGUgaW5uZXIgYW5udWx1cy4gPC9mb250PgoKPC9jZW50ZXI+CgojIyMgTG9hZGluZyBMaWJyYXJpZXMgYW5kIEltcG9ydCBEYXRhLVNldAoKVGhlIGRhdGEgd2VyZSBpbXBvcnRlZCBhcyB0eHQuIGZpbGVzLiBUaGUgc2Vuc29yIG51bWJlcnMgd2VyZSB0aGVuIGNvbnZlcnRlZCB0byBhIGZhY3RvciAoYGFzLmZhY3RvcigpYCwgcGFja2FnZSAiYmFzZSIpIGFuZCB0aGUgdGltZSB3YXMgdHJhbnNmb3JtZWQgdG8gYSBkYXRlLXRpbWUgZm9ybWF0IChgZG15X2htcygpYCwgcGFja2FnZSAibHVicmlkYXRlIikuIFRoZSB0aW1lIHNpbmNlIHRoZSBzdGFydCBvZiB0aGUgZXhwZXJpbWVudCB3YXMgYWxzbyBhZGRlZCAoYGRpZmZ0aW1lKClgLCBwYWNrYWdlICJiYXNlIikuIFRoZSBwYWNrYWdlcyAiZ2dwbG90MiIsICJnZ3BtaXNjIiBhbmQgImdncHJpc20iIHdlcmUgdXNlZCB0byBjcmVhdGUgdGhlIGRpYWdyYW1zLgoKYGBge3Igc2V0dXAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdncG1pc2MpCmxpYnJhcnkoZ2dwcmlzbSkKClNpa2FkdXJfcmF3IDwtIHJlYWQuY3N2KCJFeHBlcmltZW50MV9TaWthZHVyLnR4dCIsIHNlcCA9ICI7IiwgaGVhZGVyID0gVCwgY29sLm5hbWVzID0gYygiVGltZSIsIlNlbnNvcl9ObyIsIkFuYWxvZ19SZWFkIiwiVm9sdGFnZV9tViIsIlRlbXBlcmF0dXJlX2RlZ0MiKSkKClNpa2FkdXJfYm90aF9hbm51bHVzIDwtIFNpa2FkdXJfcmF3ICU+JQogIG11dGF0ZShTZW5zb3JfTm8gPSBhcy5mYWN0b3IoU2Vuc29yX05vKSkgJT4lCiAgbXV0YXRlKFRpbWUgPSBkbXlfaG1zKFRpbWUpKSAlPiUKICBtdXRhdGUoVGltZV9zaW5jZV9TdGFydCA9IGRpZmZ0aW1lKHRpbWUxID0gVGltZSwgdGltZTIgPSBtaW4oVGltZSksIHVuaXRzID0gImhvdXJzIikpICU+JQogIGZpbHRlcihTZW5zb3JfTm8gPT0gMSB8IFNlbnNvcl9ObyA9PSAzKQoKU2lrYWR1cl9vdXRlcl9hbm51bHVzIDwtIFNpa2FkdXJfcmF3ICU+JQogIG11dGF0ZShTZW5zb3JfTm8gPSBhcy5mYWN0b3IoU2Vuc29yX05vKSkgJT4lCiAgbXV0YXRlKFRpbWUgPSBkbXlfaG1zKFRpbWUpKSAlPiUKICBmaWx0ZXIoVGltZSA+PSAiMjAyMy0wNi0wNyAxNTowMDowMCIpICU+JQogIG11dGF0ZShUaW1lX3NpbmNlX1N0YXJ0ID0gZGlmZnRpbWUodGltZTEgPSBUaW1lLCB0aW1lMiA9IG1pbihUaW1lKSwgdW5pdHMgPSAiaG91cnMiKSkgJT4lCiAgZmlsdGVyKFNlbnNvcl9ObyA9PSAyIHwgU2Vuc29yX05vID09IDQpCgoKCkJpcmVzaW5fcmF3IDwtIHJlYWQuY3N2KCJFeHBlcmltZW50Ml9CaXJlc2luLnR4dCIsIHNlcCA9ICI7IiwgaGVhZGVyID0gVCwgY29sLm5hbWVzID0gYygiVGltZSIsIlNlbnNvcl9ObyIsIkFuYWxvZ19SZWFkIiwiVm9sdGFnZV9tViIsIlRlbXBlcmF0dXJlX2RlZ0MiKSkKCkJpcmVzaW5fYm90aF9hbm51bHVzIDwtIEJpcmVzaW5fcmF3ICU+JQogIG11dGF0ZShTZW5zb3JfTm8gPSBhcy5mYWN0b3IoU2Vuc29yX05vKSkgJT4lCiAgbXV0YXRlKFRpbWUgPSBkbXlfaG1zKFRpbWUpKSAlPiUKICBtdXRhdGUoVGltZV9zaW5jZV9TdGFydCA9IGRpZmZ0aW1lKHRpbWUxID0gVGltZSwgdGltZTIgPSBtaW4oVGltZSksIHVuaXRzID0gImhvdXJzIikpICU+JQogIGZpbHRlcihTZW5zb3JfTm8gPT0gMSB8IFNlbnNvcl9ObyA9PSAzKQoKQmlyZXNpbl9vdXRlcl9hbm51bHVzIDwtIEJpcmVzaW5fcmF3ICU+JQogIG11dGF0ZShTZW5zb3JfTm8gPSBhcy5mYWN0b3IoU2Vuc29yX05vKSkgJT4lCiAgbXV0YXRlKFRpbWUgPSBkbXlfaG1zKFRpbWUpKSAlPiUKICBmaWx0ZXIoVGltZSA+PSAiMjAyMy0wNi0wNyAxNTowMDowMCIpICU+JQogIG11dGF0ZShUaW1lX3NpbmNlX1N0YXJ0ID0gZGlmZnRpbWUodGltZTEgPSBUaW1lLCB0aW1lMiA9IG1pbihUaW1lKSwgdW5pdHMgPSAiaG91cnMiKSkgJT4lCiAgZmlsdGVyKFNlbnNvcl9ObyA9PSAyIHwgU2Vuc29yX05vID09IDQpCgpgYGAKCiMjIFJlc3VsdHMKCiMjIyBTaWthZHVyCgpXaGVuIGJvdGggYW5udWxpIGhhdmUgYmVlbiBmaWxsZWQsIHRoZSB0ZW1wZXJhdHVyZSByZWFjaGVkIGl0cyBtYXhpbXVtIGFmdGVyIG9uZSBob3VyIGFuZCB3YXMgYXQgMTQywrBDIChpbm5lciBhbm51bHVzKSBhbmQgMTM0wrBDIChvdXRlciBhbm51bHVzKSByZXNwZWN0aXZlbHkgKEZpZ3VyZSAzKS4gVG8gZmlsbCB0aGUgY3lsaW5kZXIgY29tcGxldGVseSB3aXRoIHRoZSByZXNpbiwgMTMgbWludXRlcyB3ZXJlIG5lZWRlZC4gVGhlIHZpc2Nvc2l0eSBvZiB0aGUgU2lrYWR1ciBzbG93bHkgaW5jcmVhc2VkIGFmdGVyIDE1IG1pbnV0ZXMgYW5kIGJlY2FtZSBzb2xpZCBhZnRlciAxIGhvdXJzLiBGcm9tIHRoaXMgbW9tZW50IG9uLCB0aGVyZSB3YXMgbWluaW1hbCBzbW9rZSBkZXZlbG9wbWVudCBmb3IgYWJvdXQgNCBtaW51dGVzLiBTb21lIHN0cmVzcyBjcmFja3MgZm9ybWVkIChGaWd1cmUgNCkuIFRoZSB2b2x1bWUgb2YgaW5pdGlhbGx5IDEuMjUgTCBkZWNyZWFzZWQgYnkgMjAgbUwgKC0xLjYgJSkuIFRoZSBheGlhbCBkaWFtZXRlciByZW1haW5lZCB1bmNoYW5nZWQgYXQgcn4xfiA9IDIuMTUgY20gY20gYW5kIHJ+MX4gPSAyLjUgY20gcmVzcGVjdGl2ZWx5LgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9VFJVRSwgZmlnLmFsaWduPSJjZW50ZXIifQoKU2lrYWR1cl9ib3RoX2FubnVsdXNfUGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IFNpa2FkdXJfYm90aF9hbm51bHVzLCBtYXBwaW5nID0gYWVzKHggPSBUaW1lX3NpbmNlX1N0YXJ0LCB5ID0gVGVtcGVyYXR1cmVfZGVnQywgY29sb3VyID0gU2Vuc29yX05vKSkgKwogIGdlb21fbGluZShsaW5ld2lkdGggPSAxLjI1KSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHIgPSAxNSkpLCAKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHQgPSAxMCkpLCAKICAgICAgICBheGlzLnRleHQ9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIikpICsKICB4bGFiKCJUaW1lIFtoXSIpICsKICB5bGFiKGV4cHJlc3Npb24oIlRlbXBlcmF0dXJlIFvCsENdIikpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoZ3VpZGUgPSAicHJpc21fbWlub3IiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAsIDE2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbm9yX2JyZWFrcyA9IHNlcSgwLCAxNiwgMikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDE2MCksIGJyZWFrcyA9IHNlcSgwLCAxNjAsIDEwKSwgZXhwYW5kID0gYygwLDApKSArCiAgbGFicyhjYXB0aW9uID0gIkpvbmFzIE0uIFdpbmRpc2NoLCBNb250IFRlcnJpIFJvY2sgTGFiLCBzd2lzc3RvcG8iKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gYygwLjksIDAuNSkpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiVGVtcGVyYXR1ciBTZW5zb3JzIikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygiTm8uIDEgKG91dGVyIGFubnVsdXMpIiwgIk5vLiAzIChpbm5lciBhbm51bHVzKSIpLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJkYXJrb2xpdmVncmVlbjMiLCJyb3lhbGJsdWUxIikpICsKICBnZ3RpdGxlKCJTaWthZHVyLTUyIChib3RoIGFubnVsdXMgZmlsbGVkKSIpICsKICBzdGF0X3BlYWtzKHNwYW4gPSBOVUxMLAogICAgICAgICAgICAgZ2VvbSA9ICJ0ZXh0X3MiLAogICAgICAgICAgICAgbWFwcGluZyA9IGFlcyhsYWJlbCA9IHBhc3RlKGFmdGVyX3N0YXQoeS5sYWJlbCksIGFmdGVyX3N0YXQoeC5sYWJlbCkpKSwKICAgICAgICAgICAgIHgubGFiZWwuZm10ID0gImFmdGVyICUuMGYgaHJzICIsCiAgICAgICAgICAgICB5LmxhYmVsLmZtdCA9ICIgTWF4IFRlbXAuIG9mICUuMGbCsEMiLAogICAgICAgICAgICAgYXJyb3cgPSBncmlkOjphcnJvdyhsZW5ndGggPSB1bml0KDAuMywgImNtIikpLAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9udWRnZV9rZWVwKHggPSBjKDAuNSwgMC4yNSksICB5ID0gYyg1LCAxMCkpLAogICAgICAgICAgICAgaGp1c3QgPSAwKQogIApTaWthZHVyX2JvdGhfYW5udWx1c19QbG90CgpnZ3NhdmUoZmlsZW5hbWUgPSAiU2lrYWR1cl9ib3RoX2FubnVsdXMucGRmIiwgcGxvdCA9IFNpa2FkdXJfYm90aF9hbm51bHVzX1Bsb3QsIHdpZHRoID0gMjUsIGhlaWdodCA9IDEwLCB1bml0cyA9ICJjbSIsIGRwaSA9IDExMDApCgpTaWthZHVyX2JvdGhfYW5udWx1c19QbG90X3RyYW5zcGFyZW50IDwtIFNpa2FkdXJfYm90aF9hbm51bHVzX1Bsb3QgKyB0aGVtZShsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksCiAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gTkEpKQpnZ3NhdmUoU2lrYWR1cl9ib3RoX2FubnVsdXNfUGxvdF90cmFuc3BhcmVudCwgZmlsZW5hbWUgPSAiU2lrYWR1cl9ib3RoX2FubnVsdXNfdHJhbnNwYXJlbnQucG5nIiwgYmcgPSAidHJhbnNwYXJlbnQiKQoKYGBgCgo8Y2VudGVyPjxmb250IHNpemUgPSAiMiI+ICoqRmlndXJlIDM6KiogVGVtcGVyYXR1cmUgY3VydmUgb2YgdGhlIFNpa2FkdXItNTIgcmVzaW4gKGJvdGggYW5udWxpIGZpbGxlZCkgbWVhc3VyZWQgZXZlcnkgNiBzZWNvbmRzIG92ZXIgMTYgaG91cnMuIDwvZm9udD48YnI+CgohW10oSW1hZ2VzL0NyYWNrc19TaWthZHVyLnBuZyl7d2lkdGg9IjMwMCJ9Cgo8Zm9udCBzaXplID0gIjIiPiAqKkZpZ3VyZSA0OioqIENsb3NlLXVwIGltYWdlIG9mIHN0cmVzcyBjcmFja3MgaW4gU2lrYWR1ci01MiByZXNpbiAoYm90aCBhbm51bGkgZmlsbGVkKS4gPC9mb250PjwvY2VudGVyPjxicj4KCklmIG9ubHkgdGhlIGlubmVyIGFubnVsdXMgaGFzIGJlZW4gZmlsbGVkLCB0aGUgdGVtcGVyYXR1cmUgcmVhY2hlZCBpdHMgbWF4aW11bSBhZnRlciBvbmUgaG91ciBhbmQgd2FzIGF0IDEzMMKwQyAobG93ZXIgdGhpcmQpIGFuZCAxMTTCsEMgKGhpZ2hlciB0aGlyZCkgcmVzcGVjdGl2ZWx5IChGaWd1cmUgNSkuIFRvIGZpbGwgdGhlIGN5bGluZGVyIGNvbXBsZXRlbHkgd2l0aCB0aGUgcmVzaW4sIDExIG1pbnV0ZXMgd2VyZSBuZWVkZWQuIFRoZSB2aXNjb3NpdHkgb2YgdGhlIFNpa2FkdXIgc2xvd2x5IGluY3JlYXNlZCBhZnRlciAxNSBob3VycyBhbmQgYmVjYW1lIHNvbGlkIGFmdGVyIDEgaG91cnMuIEZyb20gdGhpcyBtb21lbnQgb24sIHRoZXJlIHdhcyBtaW5pbWFsIHNtb2tlIGRldmVsb3BtZW50IGZvciBhYm91dCAzIG1pbnV0ZXMuIFNvbWUgc3RyZXNzIGNyYWNrcyBmb3JtZWQuIFRoZSB2b2x1bWUgb2YgaW5pdGlhbGx5IDAuOCBMIGRlY3JlYXNlZCBieSAyMCBtTCAoLTIuNSAlKS4gVGhlIGF4aWFsIGRpYW1ldGVyIHJlbWFpbmVkIHVuY2hhbmdlZC4KCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PVRSVUUsIGZpZy5hbGlnbj0iY2VudGVyIn0KClNpa2FkdXJfb3V0ZXJfYW5udWx1c19QbG90IDwtIGdncGxvdChkYXRhID0gU2lrYWR1cl9vdXRlcl9hbm51bHVzLCBtYXBwaW5nID0gYWVzKHggPSBUaW1lX3NpbmNlX1N0YXJ0LCB5ID0gVGVtcGVyYXR1cmVfZGVnQywgY29sb3VyID0gU2Vuc29yX05vKSkgKwogIGdlb21fbGluZShsaW5ld2lkdGggPSAxLjI1KSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHIgPSAxNSkpLCAKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHQgPSAxMCkpLCAKICAgICAgICBheGlzLnRleHQ9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIikpICsKICB4bGFiKCJUaW1lIFtoXSIpICsKICB5bGFiKGV4cHJlc3Npb24oIlRlbXBlcmF0dXJlIFvCsENdIikpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoZ3VpZGUgPSAicHJpc21fbWlub3IiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAsIDE2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbm9yX2JyZWFrcyA9IHNlcSgwLCAxNiwgMikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDE2MCksIGJyZWFrcyA9IHNlcSgwLCAxNjAsIDEwKSwgZXhwYW5kID0gYygwLDApKSArCiAgbGFicyhjYXB0aW9uID0gIkpvbmFzIE0uIFdpbmRpc2NoLCBNb250IFRlcnJpIFJvY2sgTGFiLCBzd2lzc3RvcG8iKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gYygwLjksIDAuNSkpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiVGVtcGVyYXR1ciBTZW5zb3JzIikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygiTm8uIDIgKGxvd2VyIHRoaXJkKSIsICJOby4gNCAodXBwZXIgdGhpcmQpIiksCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImRhcmtvbGl2ZWdyZWVuMyIsInJveWFsYmx1ZTEiKSkgKwogIGdndGl0bGUoIlNpa2FkdXItNTIgKG91dGVyIGFubnVsdXMgZmlsbGVkKSIpICsKICBzdGF0X3BlYWtzKHNwYW4gPSBOVUxMLAogICAgICAgICAgICAgZ2VvbSA9ICJ0ZXh0X3MiLAogICAgICAgICAgICAgbWFwcGluZyA9IGFlcyhsYWJlbCA9IHBhc3RlKGFmdGVyX3N0YXQoeS5sYWJlbCksIGFmdGVyX3N0YXQoeC5sYWJlbCkpKSwKICAgICAgICAgICAgIHgubGFiZWwuZm10ID0gImFmdGVyICUuMGYgaHJzICIsCiAgICAgICAgICAgICB5LmxhYmVsLmZtdCA9ICIgTWF4IFRlbXAuIG9mICUuMGbCsEMiLAogICAgICAgICAgICAgYXJyb3cgPSBncmlkOjphcnJvdyhsZW5ndGggPSB1bml0KDAuMywgImNtIikpLAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9udWRnZV9rZWVwKHggPSBjKDAuNSwgMC4yNSksICB5ID0gYyg1LCAxMCkpLAogICAgICAgICAgICAgaGp1c3QgPSAwKQogIApTaWthZHVyX291dGVyX2FubnVsdXNfUGxvdAoKZ2dzYXZlKGZpbGVuYW1lID0gIlNpa2FkdXJfb3V0ZXJfYW5udWx1cy5wZGYiLCBwbG90ID0gU2lrYWR1cl9vdXRlcl9hbm51bHVzX1Bsb3QsIHdpZHRoID0gMjUsIGhlaWdodCA9IDEwLCB1bml0cyA9ICJjbSIsIGRwaSA9IDExMDApCgpTaWthZHVyX291dGVyX2FubnVsdXNfUGxvdF90cmFuc3BhcmVudCA8LSBTaWthZHVyX291dGVyX2FubnVsdXNfUGxvdCArIHRoZW1lKGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgICAgICBsZWdlbmQuYm94LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBOQSkpCmdnc2F2ZShTaWthZHVyX291dGVyX2FubnVsdXNfUGxvdF90cmFuc3BhcmVudCwgZmlsZW5hbWUgPSAiU2lrYWR1cl9vdXRlcl9hbm51bHVzX3RyYW5zcGFyZW50LnBuZyIsIGJnID0gInRyYW5zcGFyZW50IikKCmBgYAoKPGNlbnRlcj48Zm9udCBzaXplID0gIjIiPiAqKkZpZ3VyZSA1OioqIFRlbXBlcmF0dXJlIGN1cnZlIG9mIHRoZSBTaWthZHVyLTUyIHJlc2luIChvdXRlciBhbm51bHVzIGZpbGxlZCkgbWVhc3VyZWQgZXZlcnkgNiBzZWNvbmRzIG92ZXIgMTYgaG91cnMuIDwvZm9udD48L2NlbnRlcj4KCiMjIyBCaXJlc2luCgpXaGVuIGJvdGggYW5udWxpIGhhdmUgYmVlbiBmaWxsZWQsIHRoZSB0ZW1wZXJhdHVyZSByZWFjaGVkIGl0cyBtYXhpbXVtIGFmdGVyIDggdG8gOSBob3VycyBhbmQgd2FzIGF0IDE0NcKwQyAoaW5uZXIgYW5udWx1cykgYW5kIDE0NMKwQyAob3V0ZXIgYW5udWx1cykgcmVzcGVjdGl2ZWx5IChGaWd1cmUgNikuIFRvIGZpbGwgdGhlIGN5bGluZGVyIGNvbXBsZXRlbHkgd2l0aCB0aGUgcmVzaW4sIDcgbWludXRlcyB3ZXJlIG5lZWRlZC4gVGhlIHZpc2Nvc2l0eSBvZiB0aGUgQmlyZXNpbiBzbG93bHkgaW5jcmVhc2VkIGFmdGVyIDYgaG91cnMgYW5kIGJlY2FtZSBzb2xpZCBhZnRlciA4IGhvdXJzLiBGcm9tIHRoaXMgbW9tZW50IG9uLCB0aGVyZSB3YXMgbWluaW1hbCBzbW9rZSBkZXZlbG9wbWVudCBmb3IgYWJvdXQgMyBtaW51dGVzLiBTb21lIHN0cmVzcyBjcmFja3MgZm9ybWVkIChGaWd1cmUgNykuIFRoZSB2b2x1bWUgb2YgaW5pdGlhbGx5IDEuMjUgTCBkZWNyZWFzZWQgYnkgNTAgbUwgKC00ICUpLiBUaGUgYXhpYWwgZGlhbWV0ZXIgcmVtYWluZWQgdW5jaGFuZ2VkLgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9VFJVRSwgZmlnLmFsaWduPSJjZW50ZXIifQoKQmlyZXNpbl9ib3RoX2FubnVsdXNfUGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IEJpcmVzaW5fYm90aF9hbm51bHVzLCBtYXBwaW5nID0gYWVzKHggPSBUaW1lX3NpbmNlX1N0YXJ0LCB5ID0gVGVtcGVyYXR1cmVfZGVnQywgY29sb3VyID0gU2Vuc29yX05vKSkgKwogIGdlb21fbGluZShsaW5ld2lkdGggPSAxLjI1KSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHIgPSAxNSkpLCAKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHQgPSAxMCkpLCAKICAgICAgICBheGlzLnRleHQ9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIikpICsKICB4bGFiKCJUaW1lIFtoXSIpICsKICB5bGFiKGV4cHJlc3Npb24oIlRlbXBlcmF0dXJlIFvCsENdIikpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoZ3VpZGUgPSAicHJpc21fbWlub3IiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAsIDE2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbm9yX2JyZWFrcyA9IHNlcSgwLCAxNiwgMikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDE2MCksIGJyZWFrcyA9IHNlcSgwLCAxNjAsIDEwKSwgZXhwYW5kID0gYygwLDApKSArCiAgbGFicyhjYXB0aW9uID0gIkpvbmFzIE0uIFdpbmRpc2NoLCBNb250IFRlcnJpIFJvY2sgTGFiLCBzd2lzc3RvcG8iKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gYygwLjI1LCAwLjUpKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIlRlbXBlcmF0dXIgU2Vuc29ycyIpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKGxhYmVscyA9IGMoIk5vLiAxIChvdXRlciBhbm51bHVzKSIsICJOby4gMyAoaW5uZXIgYW5udWx1cykiKSwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiZGFya29saXZlZ3JlZW4zIiwicm95YWxibHVlMSIpKSArCiAgZ2d0aXRsZSgiQmlyZXNpbiBDUjgzICYgQ0g4My0xMCAoYm90aCBhbm51bHVzIGZpbGxlZCkiKSArCiAgc3RhdF9wZWFrcyhzcGFuID0gTlVMTCwKICAgICAgICAgICAgIGdlb20gPSAidGV4dF9zIiwKICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMobGFiZWwgPSBwYXN0ZShhZnRlcl9zdGF0KHkubGFiZWwpLCBhZnRlcl9zdGF0KHgubGFiZWwpKSksCiAgICAgICAgICAgICB4LmxhYmVsLmZtdCA9ICJhZnRlciAlLjBmIGhycyAiLAogICAgICAgICAgICAgeS5sYWJlbC5mbXQgPSAiIE1heCBUZW1wLiBvZiAlLjBmwrBDIiwKICAgICAgICAgICAgIGFycm93ID0gZ3JpZDo6YXJyb3cobGVuZ3RoID0gdW5pdCgwLjMsICJjbSIpKSwKICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fbnVkZ2VfY2VudGVyKHggPSBjKC0wLjUsIC0wLjI1KSwgIHkgPSBjKC00LCA2KSksCiAgICAgICAgICAgICBoanVzdCA9IDEpCiAgCkJpcmVzaW5fYm90aF9hbm51bHVzX1Bsb3QKCmdnc2F2ZShmaWxlbmFtZSA9ICJCaXJlc2luX2JvdGhfYW5udWx1cy5wZGYiLCBwbG90ID0gQmlyZXNpbl9ib3RoX2FubnVsdXNfUGxvdCwgd2lkdGggPSAyNSwgaGVpZ2h0ID0gMTAsIHVuaXRzID0gImNtIiwgZHBpID0gMTEwMCkKCkJpcmVzaW5fYm90aF9hbm51bHVzX1Bsb3RfdHJhbnNwYXJlbnQgPC0gQmlyZXNpbl9ib3RoX2FubnVsdXNfUGxvdCArIHRoZW1lKGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgICAgICBsZWdlbmQuYm94LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBOQSkpCmdnc2F2ZShCaXJlc2luX2JvdGhfYW5udWx1c19QbG90X3RyYW5zcGFyZW50LCBmaWxlbmFtZSA9ICJCaXJlc2luX2JvdGhfYW5udWx1c190cmFuc3BhcmVudC5wbmciLCBiZyA9ICJ0cmFuc3BhcmVudCIpCgpgYGAKCjxjZW50ZXI+PGZvbnQgc2l6ZSA9ICIyIj4gKipGaWd1cmUgNjoqKiBUZW1wZXJhdHVyZSBjdXJ2ZSBvZiB0aGUgQmlyZXNpbiBDUjgzICYgQ0g4My0xMCByZXNpbiAoYm90aCBhbm51bGkgZmlsbGVkKSBtZWFzdXJlZCBldmVyeSA2IHNlY29uZHMgb3ZlciAxNiBob3Vycy4gPC9mb250Pjxicj4KCiFbXShJbWFnZXMvQ3JhY2tzX0JpcmVzaW4ucG5nKXt3aWR0aD0iMzAwIn0KCjxmb250IHNpemUgPSAiMiI+ICoqRmlndXJlIDc6KiogQ2xvc2UtdXAgaW1hZ2Ugb2Ygc3RyZXNzIGNyYWNrcyBpbiBCaXJlc2luIENSODMgJiBDSDgzLTEwIHJlc2luIChib3RoIGFubnVsaSBmaWxsZWQpLiA8L2ZvbnQ+PC9jZW50ZXI+PGJyPgoKSWYgb25seSB0aGUgaW5uZXIgYW5udWx1cyBoYXMgYmVlbiBmaWxsZWQsIHRoZSB0ZW1wZXJhdHVyZSByZWFjaGVkIGl0cyBtYXhpbXVtIGFmdGVyIDExIGhvdXJzIGFuZCB3YXMgYXQgMTEzwrBDIChsb3dlciB0aGlyZCkgYW5kIDkxwrBDIChoaWdoZXIgdGhpcmQpIHJlc3BlY3RpdmVseSAoRmlndXJlIDgpLiBUbyBmaWxsIHRoZSBjeWxpbmRlciBjb21wbGV0ZWx5IHdpdGggdGhlIHJlc2luLCA0IG1pbnV0ZXMgd2VyZSBuZWVkZWQuIFRoZSB2aXNjb3NpdHkgb2YgdGhlIEJpcmVzaW4gc2xvd2x5IGluY3JlYXNlZCBhZnRlciA2IGhvdXJzIGFuZCBiZWNhbWUgc29saWQgYWZ0ZXIgOCBob3Vycy4gRnJvbSB0aGlzIG1vbWVudCBvbiwgdGhlcmUgd2FzIG1pbmltYWwgc21va2UgZGV2ZWxvcG1lbnQgZm9yIGFib3V0IDIgbWludXRlcy4gU29tZSBzdHJlc3MgY3JhY2tzIGZvcm1lZC4gVGhlIHZvbHVtZSBvZiBpbml0aWFsbHkgMSBMIGRlY3JlYXNlZCBieSA2MCBtTCAoLTYgJSkuIFRoZSBheGlhbCBkaWFtZXRlciByZW1haW5lZCB1bmNoYW5nZWQuCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1UUlVFLCBmaWcuYWxpZ249ImNlbnRlciJ9CgpCaXJlc2luX291dGVyX2FubnVsdXNfUGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IEJpcmVzaW5fb3V0ZXJfYW5udWx1cywgbWFwcGluZyA9IGFlcyh4ID0gVGltZV9zaW5jZV9TdGFydCwgeSA9IFRlbXBlcmF0dXJlX2RlZ0MsIGNvbG91ciA9IFNlbnNvcl9ObykpICsKICBnZW9tX2xpbmUobGluZXdpZHRoID0gMS4yNSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbihyID0gMTUpKSwgCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbih0ID0gMTApKSwgCiAgICAgICAgYXhpcy50ZXh0PSBlbGVtZW50X3RleHQoY29sb3VyPSJibGFjayIpKSArCiAgeGxhYigiVGltZSBbaF0iKSArCiAgeWxhYihleHByZXNzaW9uKCJUZW1wZXJhdHVyZSBbwrBDXSIpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGd1aWRlID0gInByaXNtX21pbm9yIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLCAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5vcl9icmVha3MgPSBzZXEoMCwgMTYsIDIpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxNjApLCBicmVha3MgPSBzZXEoMCwgMTYwLCAxMCksIGV4cGFuZCA9IGMoMCwwKSkgKwogIGxhYnMoY2FwdGlvbiA9ICJKb25hcyBNLiBXaW5kaXNjaCwgTW9udCBUZXJyaSBSb2NrIExhYiwgc3dpc3N0b3BvIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC4yNSwgMC41KSkgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9ICJUZW1wZXJhdHVyIFNlbnNvcnMiKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChsYWJlbHMgPSBjKCJOby4gMiAobG93ZXIgdGhpcmQpIiwgIk5vLiA0ICh1cHBlciB0aGlyZCkiKSwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiZGFya29saXZlZ3JlZW4zIiwicm95YWxibHVlMSIpKSArCiAgZ2d0aXRsZSgiQmlyZXNpbiBDUjgzICYgQ0g4My0xMCAob3V0ZXIgYW5udWx1cyBmaWxsZWQpIikgKwogIHN0YXRfcGVha3Moc3BhbiA9IE5VTEwsCiAgICAgICAgICAgICBnZW9tID0gInRleHRfcyIsCiAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKGxhYmVsID0gcGFzdGUoYWZ0ZXJfc3RhdCh5LmxhYmVsKSwgYWZ0ZXJfc3RhdCh4LmxhYmVsKSkpLAogICAgICAgICAgICAgeC5sYWJlbC5mbXQgPSAiYWZ0ZXIgJS4wZiBocnMgIiwKICAgICAgICAgICAgIHkubGFiZWwuZm10ID0gIiBNYXggVGVtcC4gb2YgJS4wZsKwQyIsCiAgICAgICAgICAgICBhcnJvdyA9IGdyaWQ6OmFycm93KGxlbmd0aCA9IHVuaXQoMC4zLCAiY20iKSksCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX251ZGdlX2tlZXAoeCA9IGMoLTAuNSwgLTAuMjUpLCAgeSA9IGMoNSwgMTApKSwKICAgICAgICAgICAgIGhqdXN0ID0gMSkKICAKQmlyZXNpbl9vdXRlcl9hbm51bHVzX1Bsb3QKCmdnc2F2ZShmaWxlbmFtZSA9ICJCaXJlc2luX291dGVyX2FubnVsdXMucGRmIiwgcGxvdCA9IEJpcmVzaW5fb3V0ZXJfYW5udWx1c19QbG90LCB3aWR0aCA9IDI1LCBoZWlnaHQgPSAxMCwgdW5pdHMgPSAiY20iLCBkcGkgPSAxMTAwKQoKQmlyZXNpbl9vdXRlcl9hbm51bHVzX1Bsb3RfdHJhbnNwYXJlbnQgPC0gQmlyZXNpbl9vdXRlcl9hbm51bHVzX1Bsb3QgKyB0aGVtZShsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksCiAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gTkEpKQpnZ3NhdmUoQmlyZXNpbl9vdXRlcl9hbm51bHVzX1Bsb3RfdHJhbnNwYXJlbnQsIGZpbGVuYW1lID0gIkJpcmVzaW5fb3V0ZXJfYW5udWx1c190cmFuc3BhcmVudC5wbmciLCBiZyA9ICJ0cmFuc3BhcmVudCIpCgpgYGAKCjxjZW50ZXI+PGZvbnQgc2l6ZSA9ICIyIj4gKipGaWd1cmUgODoqKiBUZW1wZXJhdHVyZSBjdXJ2ZSBvZiB0aGUgQmlyZXNpbiBDUjgzICYgQ0g4My0xMCByZXNpbiAob3V0ZXIgYW5udWx1cyBmaWxsZWQpIG1lYXN1cmVkIGV2ZXJ5IDYgc2Vjb25kcyBvdmVyIDE2IGhvdXJzLiA8L2ZvbnQ+PC9jZW50ZXI+Cg==